<?php

namespace App\Admin\Controllers;

use App\Models\Specification;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Show;
use App\Models\Category;
use Illuminate\Http\Request;
use Encore\Admin\Layout\Content;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\HasResourceActions;

class CategoriesController extends Controller
{
    use HasResourceActions;

    /**
     * Index interface.
     *
     * @param Content $content
     * @return Content
     */
    public function index(Content $content)
    {
        return $content
            ->header('商品类目列表')
            ->body($this->grid());
    }
/**
     * Show interface.
     *
     * @param mixed $id
     * @param Content $content
     * @return Content
     */
    public function show($id, Content $content)
    {
        return $content
            ->header('查看类目')
            ->body($this->detail($id));
    }

    /**
     * Edit interface.
     *
     * @param mixed $id
     * @param Content $content
     * @return Content
     */
    public function edit($id, Content $content)
    {
        return $content
            ->header('编辑商品类目')
            ->body($this->form(true)->edit($id));
    }

    /**
     * Create interface.
     *
     * @param Content $content
     * @return Content
     */
    public function create(Content $content)
    {
        return $content
            ->header('添加商品类目')
            ->body($this->form(false));
    }

    /**
     * Make a grid builder.
     *
     * @return Grid
     */
    protected function grid()
    {
        $grid = new Grid(new Category);

        $grid->id('Id')->sortable();
        $grid->name('类目名称');
        $grid->is_directory('是否目录')->display(function ($value) {
            return $value ? '是' : '否';
        })->sortable();
        $grid->path('类目路径');
        $grid->sort('排序')->sortable();
        $grid->thum('缩略图')->lightbox(['width' => 50, 'height' => 50]);
        $grid->bz('备注');

        $states = [
            'on'  => ['value' => 1, 'text' => '显示', 'color' => 'success'],
            'off' => ['value' => 0, 'text' => '不显示', 'color' => 'danger'],
        ];
        $grid->is_show('是否显示')->switch($states);
        $grid->actions(function ($actions) {
            // 不展示 Laravel-Admin 默认的查看按钮
            $actions->disableView();
        });

        $grid->disableFilter();
        $grid->disableExport();
        return $grid;
    }

/**
     * Make a show builder.
     *
     * @param mixed $id
     * @return Show
     */
    protected function detail($id)
    {
        $show = new Show(Category::findOrFail($id));

        $show->id('Id');
        $show->parent_id('上级Id');
        $show->name('类目名称');
        $show->is_directory('是否目录')->using([0 => '否', 1 => '是']);
        $show->thum('缩略图')->image();
        $show->sort('排序');
        $show->bz('备注');
        $show->created_at('创建时间');
        $show->updated_at('最近修改');

        return $show;
    }

    /**
     * Make a form builder.
     *
     * @return Form
     */
    protected function form($isEditing = false)
    {
        $form = new Form(new Category);
        $form->text('name', '类目名称')->rules('required');
        // 如果是编辑的情况
        if ($isEditing) {
            // 不允许用户修改『是否目录』和『父类目』字段的值
            // 用 display() 方法来展示值，with() 方法接受一个匿名函数，会把字段值传给匿名函数并把返回值展示出来
            $form->display('is_directory', '是否目录')->with(function ($value) {
                return $value ? '是' :'否';
            });
            // 支持用符号 . 来展示关联关系的字段
            $form->select('parent_id', '父类目')->options(Category::where('is_directory',1)->pluck('name','id'));
        } else {
            // 定义一个名为『是否目录』的单选框
           $form->radio('is_directory', '是否目录')
                ->options(['1' => '是', '0' => '否'])
                ->default('0')
                ->rules('required');

            // 定义一个名为父类目的下拉框
            $form->select('parent_id', '父类目')->ajax('/admin/api/categories');
        }
        $form->checkbox('specs', '选择规格')->options(Specification::pluck('title', 'id'));
        $form->number('sort', '排序')->default(0);
        $form->image('thum', '缩略图')->rules('image');
        $form->text('bz', '备注');

        $states = [
            'on'  => ['value' => 1, 'text' => '显示', 'color' => 'success'],
            'off' => ['value' => 0, 'text' => '不显示', 'color' => 'danger'],
        ];
        $form->switch('is_show', '是否显示')->states($states)->default(1);
        $form->hidden('path');

        // // 直接添加一对多的关联模型
        // $form->hasMany('attributes', '属性列表', function (Form\NestedForm $form) {
        //     $form->text('name', '属性名称')->rules('required');
        //     $form->radio('is_common', '是否通用属性')
        //         ->options(['1' => '是', '0' => '否'])
        //         ->default('0')
        //         ->rules('required');
        //     $form->text('bz', '属性备注')->rules('required');
        // });
        $form->tools(function (Form\Tools $tools) {
            // 去掉`查看`按钮
            $tools->disableView();
        });
        $form->footer(function ($footer) {
            // 去掉`查看`checkbox
            $footer->disableViewCheck();
        });
        return $form;
    }

    // 定义下拉框搜索接口
    public function apiIndex(Request $request)
    {
        // 用户输入的值通过 q 参数获取
        $search = $request->input('q');
        $result = Category::query()
            // 通过 is_directory 参数来控制
            ->where('is_directory', boolval($request->input('is_directory', true)))
            ->where('name', 'like', '%'.$search.'%')
            ->paginate();

        // 把查询出来的结果重新组装成 Laravel-Admin 需要的格式
        $result->setCollection($result->getCollection()->map(function (Category $category) {
            return ['id' => $category->id, 'text' => $category->fullname];
        }));

        return $result;
    }
}
